from typing import Dict, Any, Optional
import json


class PromptService:
    """基础提示词管理服务 - 专注于系统提示词和用户输入处理"""
    
    def __init__(self):
        self.system_prompt = """你是中医理疗馆的产品顾问，熟悉本馆所有理疗产品和养生器械。
        请根据客户的描述，主动推荐最适合的理疗产品，并简要介绍产品的功效、适用人群和优惠活动，鼓励客户体验和购买。"""

    """设置系统提示词"""
    def set_system_prompt(self, system_prompt: str):

        self.system_prompt = system_prompt

    """获取系统提示词"""
    def get_system_prompt(self) -> str:

        return self.system_prompt

    """构建基础提示词（系统提示词 + 用户输入）"""
    def build_base_prompt(self, user_input: str) -> str:

        return f"{self.system_prompt}\n\n用户问题：{user_input}\n\n请回答："

    """构建带上下文的提示词"""
    def build_prompt_with_context(self, user_input: str, context: str) -> str:

        return f"{self.system_prompt}\n\n上下文信息：{context}\n\n用户问题：{user_input}\n\n请基于上下文信息回答："

    """构建带记忆摘要的提示词"""
    def build_prompt_with_memory(self, user_input: str, memory_summary: str) -> str:

        return f"{self.system_prompt}\n\n对话记忆：{memory_summary}\n\n用户问题：{user_input}\n\n请基于对话记忆回答："

    """构建带RAG检索结果的提示词"""
    def build_prompt_with_rag_context(self, user_input: str, retrieved_documents: str) -> str:

        return f"{self.system_prompt}\n\n检索到的相关信息：{retrieved_documents}\n\n用户问题：{user_input}\n\n请基于检索到的信息回答："

    """构建带Agent上下文的提示词"""
    def build_prompt_with_agent_context(self, user_input: str, agent_context: str) -> str:

        return f"{self.system_prompt}\n\nAgent上下文：{agent_context}\n\n用户问题：{user_input}\n\n请基于Agent上下文回答："

    # 新增JSON格式的prompt构建方法
    """构建基础提示词的JSON格式"""
    def build_base_prompt_json(self, user_input: str) -> str:
        prompt_json = [
            {
                "type": "system",
                "content": self.system_prompt
            },
            {
                "type": "human",
                "content": user_input
            }
        ]
        return json.dumps(prompt_json, ensure_ascii=False, indent=2)

    """构建带RAG检索结果的提示词JSON格式"""
    def build_prompt_with_rag_context_json(self, user_input: str, retrieved_documents: str) -> str:
        prompt_json = [
            {
                "type": "system",
                "content": self.system_prompt
            },
            {
                "type": "human",
                "content": f"检索到的相关信息：{retrieved_documents}"
            },
            {
                "type": "human",
                "content": user_input
            }
        ]
        return json.dumps(prompt_json, ensure_ascii=False, indent=2)

    """构建带上下文的提示词JSON格式"""
    def build_prompt_with_context_json(self, user_input: str, context: str) -> str:
        prompt_json = [
            {
                "type": "system",
                "content": self.system_prompt
            },
            {
                "type": "human",
                "content": f"上下文信息：{context}"
            },
            {
                "type": "human",
                "content": user_input
            }
        ]
        return json.dumps(prompt_json, ensure_ascii=False, indent=2)

    """构建带记忆摘要的提示词JSON格式"""
    def build_prompt_with_memory_json(self, user_input: str, memory_summary: str) -> str:
        prompt_json = [
            {
                "type": "system",
                "content": self.system_prompt
            },
            {
                "type": "human",
                "content": f"对话记忆：{memory_summary}"
            },
            {
                "type": "human",
                "content": user_input
            }
        ]
        return json.dumps(prompt_json, ensure_ascii=False, indent=2)

    """构建带Agent上下文的提示词JSON格式"""
    def build_prompt_with_agent_context_json(self, user_input: str, agent_context: str) -> str:
        prompt_json = [
            {
                "type": "system",
                "content": self.system_prompt
            },
            {
                "type": "human",
                "content": f"Agent上下文：{agent_context}"
            },
            {
                "type": "human",
                "content": user_input
            }
        ]
        return json.dumps(prompt_json, ensure_ascii=False, indent=2)
